# coding=utf-8
# 行政处罚实体解析

import json
import sys

sys.path.append("..")
sys.path.append("../../")

from i_entity_extractor.extractors.default.default_extractor import DefaultExtractor
import os
import requests
import traceback
import penalty_conf
from i_entity_extractor.common_parser_lib import toolsutil
import copy
import esm
import re


class PenaltyExtractor(DefaultExtractor):
    def __init__(self, topic_info, log):
        DefaultExtractor.__init__(self, topic_info, log)
        self.seps = ['\r','\n','。','，']
        self.litigant_max_len    = 50
        self.litigant_pattern_kv = {}

        self.litigant_index = esm.Index()
        for item in penalty_conf.litigant_keyword_list:
            regex = re.compile(unicode(item + "(\S+)"))
            self.litigant_pattern_kv[unicode(item)] = regex
            self.litigant_index.enter(item)

        self.litigant_index.fix()

    def entity_extract(self, parse_info, extract_data):
        '''行政处罚实体解析入口'''
        extract_info = parse_info.extract_info
        url = parse_info.base_info.url
        province = unicode(extract_data.get("province", ""))
        self.log.info("penalty_start_parse\turl:%s\ttopic_id:%s\tprovince:%s,type:%s" % (
            url, extract_info.topic_id, province, type(province)))

        return self.format_extract_data(extract_data)

    def format_extract_data(self, extract_data):
        '''解析数据'''
        if extract_data.has_key("excel_urls"):
            excel_urls = extract_data["excel_urls"]
            excel_data_list = self.get_data_from_excelurl(excel_urls)
            excel_data_list = self.replace_field(excel_data_list, extract_data)
            return excel_data_list
        else:
            return self.get_entity_data(extract_data)

    def get_entity_data(self, extract_data):
        entity_data = copy.deepcopy(extract_data)
        title = unicode(extract_data.get("title", ""))
        province = extract_data.get("province", "")

        pos = title.find(u'局行政处罚')
        if pos != -1:
            execute_authority = title[:pos] + u'局'
            if execute_authority[0] == u'市':
                execute_authority = province + execute_authority
            entity_data["execute_authority"] = execute_authority

        content = entity_data.get("content")
        if content:
            content_list  = toolsutil.my_split(content,self.seps)
            content_list  = [x for x in content_list if x ]

            #1 解析当事人
            lititgant_ret = self.litigant_index.query(content)

            if lititgant_ret:
                keyword = unicode(lititgant_ret[0][1])
                litigant_regex = self.litigant_pattern_kv.get(keyword)
                for row_content in content_list:
                    if not row_content:
                        continue
                    ret = toolsutil.re_findone(litigant_regex,unicode(row_content))
                    if ret and len(ret) < self.litigant_max_len:
                        ret = ret.replace(":","").replace("：","")
                        entity_data["accused_name"] = ret
                        break
                    else:
                        entity_data["accused_name"] = ""

            #2 解析处罚结果
            content = unicode(content)
            for regex in penalty_conf.penalty_result_regex:
                ret = toolsutil.re_findone(regex,content)
                if ret:
                    entity_data["penalty_result"] = ret.strip()
                else:
                    entity_data["penalty_result"] = ""

            #3 解析处罚时间
            entity_data["penalty_time"] = self.parser_tool.date_parser.get_date_list(content_list[-1])

            #4 解析依据法律
            find_flag = False
            for row_content in content_list:
                if not row_content:
                    continue
                for regex in penalty_conf.legal_basis_regex:
                    ret = toolsutil.re_findone(regex,unicode(row_content))
                    if ret:
                        entity_data["legal_basis"] = ret.strip()
                        find_flag = True
                        break
                    else:
                        entity_data["legal_basis"] = ""
                if find_flag:
                    break





        return entity_data

    def get_data_from_excelurl(self, excel_url):
        '''从excel链接中提取数据'''
        excel_data_list = []
        if not excel_url:
            return excel_data_list

        url_agent = 'Mozilla/5.0 (X11; Linux i86_64) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'
        headers = {'User-Agent': url_agent}
        current_path = os.getcwd()

        try:
            file = excel_url.split('/')[-1].strip()
            filename_list = excel_url.split('/')[-1].split('.')
            filename = filename_list[0].strip() + "." + filename_list[-1].strip()
            if not os.path.exists(current_path + '/' + file):
                r = requests.get(excel_url.strip(), headers=headers, stream=True)
                with open(filename, 'wb') as f:
                    for chunk in r.iter_content(chunk_size=1024):
                        if chunk:
                            f.write(chunk)
                            f.flush()
                self.log.info("download [%s] ok !" % filename)

            excel_data_list = self.parser_tool.excel_parser.read_excel(filename)
            os.remove(filename)
            return excel_data_list

        except:
            self.log.error("read from excel error, ret[%s]" % traceback.format_exc())
            return []

    def replace_field(self, data_list, extract_data):
        '''映射字段名'''
        province = extract_data.get('province')
        publish_time = extract_data.get('publish_time')
        entity_data_list = []
        sep_list = ['\t', ' ', ',', '　', '，', ':', "："]
        for data in data_list:
            entity_data = {}
            for key, value in data.items():
                for sep in sep_list:
                    key = unicode(key).replace(sep, '')
                if penalty_conf.name_replace_map.has_key(key):
                    print key, type(key)
                    real_key = penalty_conf.name_replace_map[key]
                    if real_key == 'execute_authority_time':
                        temp_list = toolsutil.my_split(value, sep_list)
                        if len(temp_list) == 2:
                            entity_data['execute_authority'] = temp_list[0]
                            entity_data['penalty_time'] = temp_list[1]
                        else:
                            entity_data['execute_authority'] = value[:value.find(u'局') + 1]
                            entity_data['penalty_time'] = self.parser_tool.date_parser.get_date_list(value)
                    else:
                        entity_data[real_key] = value
            entity_data['province'] = province
            entity_data['publish_time'] = publish_time
            entity_data_list.append(entity_data)
        return entity_data_list


if __name__ == '__main__':

    import pytoml
    import sys

    sys.path.append('../../')
    from conf import get_config
    from bdp.i_crawler.i_extractor.ttypes import BaseInfo, CrawlInfo, ExtractInfo, PageParseInfo

    with open('../../entity.toml', 'rb') as config:
        config = pytoml.load(config)
    conf = get_config(config)
    import common

    topic_id = 68
    from entity_extractor_route import EntityExtractorRoute

    route = EntityExtractorRoute()
    topic_info = route.all_topics.get(topic_id, None)
    obj = PenaltyExtractor(topic_info, common.log)
    extract_data = {
    "_site_record_id": "http://gx.gsxt.gov.cn/xxgg/xxggAction!queryGgqx.dhtml?clear=true&notitype=51&ggid=1995859287",
    "content": "玉林市工商行政管理局  行政处罚决定书  玉工商处字〔2016〕113号   当事人：广西荣达陆风汽车销售服务有限公司，统一社会信用代码是：914509003102692244；类型：有限责任公司，（自然人投资或控股）；住所：玉林市一环北路桂平路口（州佩加油站）旁；法定代表人：张伟荣；注册资本：壹仟万圆整；成立日期：2014年07月17日；营业期限：2014年07月17日至2064年07月16日，经营范围：汽车、汽车零配件、汽车饰品的批发、零售；汽车装饰服务、汽车租赁、停车场服务；代办银行贷款手续；市场营销策划；展览展示服务；国内广告设计、制作、代理、发布（除大众媒体发布）。  2016年5月23日，消费者陈某提交一份投诉书，诉称其在向广西荣达陆风汽车销售服务有限公司购买汽车时，该公司未按购车合同时间提供车辆，请求维护消费者的合法权益，提出解除合同及双倍退还订金的要求。在处理该投诉中，本局执法人员发现广西荣达陆风汽车销售服务有限公司涉嫌违反《中华人民共和国消费者权益保护法》第二十六条之规定， 2016年6月2日，经局机关主要负责人批准，指定两名具体办案人员负责开展调查。  经查明：当事人自2014年12月份起到案发时止在玉林市一环北路桂平路口（州佩加油站）旁从事陆风品牌汽车汽车产品的整车及零部件销售与售后服务经营，在销售中，与消费者签订使用预先拟制好的《广西荣达陆风汽车销售服务有限公司订购合约书》（简称：《订购合约书》），《订购合约书》有以下条款“新车买卖合约：四、正式交车日期由双方约定，买方应于接到卖方通知后七日内办理交车手续，倘逾期尚未办理，卖方得运行解除本契约并没收已付定金，买方不得提出任何异议”。在案件调查过程，当事人利用合同格式条款获取违法所得无法查实。  证明以上事实的主要证据有：  证据一：消费者对广西荣达陆风汽车销售服务有限公司的投诉材料(包括消费者投诉书、消费者身份证复印件、广西荣达陆风汽车销售服务有限公司的《情况说明》、消费者权益争议调解书)。  证据二：执法人员2016年7月6日10时对当事人进行现场检查时所做的现场检查笔录1份，现场所拍摄的照片3张。  证据三：执法人员对当事人的受委托人陈丽伊的询问笔录2份。  证据四：执法人员向当事人提取的已使用的《订购合约书》4份复印件。                证据五：当事人提供已使用的购车发票复印件3份。     证据六：当事人提供的出租经营场地租赁合同1份。     证据七：当事人提供陆风汽车授权书复印件一份。  证据八：当事人出具广西荣达陆风汽车销售服务有限公司法定代表人身份证复印件1份，法定代表人张伟荣的授权委托书一份1份和受委托人陈丽伊的身份证复印件1份。  证据九：当事人提供2015年12月31日的资产负债表；2015年12月利润分配表；2016年6月30日的资产负债表；2016年6月利润表各一份。  证据十：当事人提供的营业执照复印件1份。  上述证据均由当事人及相关证明人签字认可。  本局认为：当事人在销售汽车中提供的《订购合同书》属于合同示范文本。在该合同示范文本的“新车买卖合约”中条款，系当事人为了重复使用而预先拟定，并在订立合同时未与对方协商的条款，属《中华人民共和国合同法》第三十九条第二款中所指的格式条款。  依据《中华人民共和国合同法》第五条“当事人应当遵循公平原则确定各方的权利和义务”、第三十九条“采用格式条款订立合同的，提供格式条款的一方应当遵循公平原则确定当事人之间的权利和义务”、第四十条“提供格式条款一方免除其责任、加重对方责任、排除对方主要权利的，该条款无效”、第九十三条“当事人协商一致，可以解除合同”，《中华人民共和国消费者权益保护法》第二十六条第二款“经营者不得以格式条款、通知、声明、店堂告示等方式，作出排除或者限制消费者权利、减轻或者免除经营者责任、加重消费者责任等对消费者不公平、不合理的规定，不得利用格式条款并借助技术手段强制交易”的规定，经营者利用其提供的合同格式文本与消费者订立汽车销售合同应遵循公平原则，合同的解除应当经双方当事人协商一致，经营者不得利用合同的格式条款作出排除或者限制消费者权利、减轻或者免除经营者责任、加重消费者责任等对消费者不公平、不合理的规定。在本案中，当事人在销售汽车合同中使用了 “新车买卖合约：四、正式交车日期由双方约定，买方应于接到卖方通知后七日内办理交车手续，倘逾期尚未办理，卖方得运行解除本契约并没收已付定金，买方不得提出任何异议” 的格式条款与消费者订立汽车订购合同，当事人在未经与消费者协商，单方面制定消费者逾期未办理交车手续的违约条款，该条款将消费者在逾期不办理交车手续的情况下，经营者可以直接解除合同，同时通过制定定金罚则对消费者设置“没收已付定金”的较重责任，加重了消费者的负担，违背《中华人民共和国合同法》中“当事人应当遵循公平原则确定各方的权利和义务”的公平原则，侵害了消费者的合法权益。  综上，当事人的行为违反了《合同违法行为监督处理办法》第十一条第一款第（六）项和第九条第一款第（四）项之规定，构成合同违法行为，应当给予行政处罚。  2016年 8 月19 日，本局向当事人送达了《玉林市工商行政管理局行政处罚告知书》(玉工商告字〔2016〕818号)，告知当事人本局拟作出行政处罚的事实、理由、依据和处罚内容，当事人在法定期限内未提出陈述、申辩意见。  依据《中华人民共和国行政处罚法》第二十三条和《合同违法行为监督处理办法》第十二条之规定，责令当事改正违法行为，处罚款人民币3000元。  当事人应自收到本处罚决定之日起十五日内到玉林市民主北路电信大楼对面的玉林市区农村信用合作联社城北信用社（开户名：玉林市工商行政管理局生产资料与生产要素市场管理分局，帐号：505112010107940802）缴纳罚款，并到玉林市工商行政管理局机动车辆市场管理所办理结案手续。依据《行政处罚法》第五十一条第一款第（一）项的规定，逾期不缴纳罚款的，每日按罚款数额的百分之三加处罚款。  当事人如不服本行政处罚决定，可在收到本行政处罚决定书之日起六十日内向广西壮族自治区工商行政管理局或玉林市人民政府申请行政复议；也可以在接到本处罚决定书之日起六个月内依法向人民法院提起诉讼。  依据《企业信息公示暂行条例》第六条第一款第（四）项和《工商行政管理机关行政处罚信息公示暂行规定》第二条、第十条的规定，本局将通过全国企业信用信息公示系统（广西）公示你公司的行政处罚信息。                                2016年9月12日",
    "execute_authority": "玉林市工商行政管理局",
    "penalty_id": "玉工商处字〔2016〕113号",
    "province": "广西"
}
    src_url = ""
    data = json.dumps(extract_data)
    extract_info = ExtractInfo(ex_status=2, extract_data=data)
    base_info = BaseInfo(url=src_url)
    parser_info = PageParseInfo(base_info=base_info, extract_info=extract_info)
    entity_data = obj.entity_extract(parser_info, extract_data)

    data = obj.after_extract(src_url, entity_data, extract_data)
    for key, value in data.items():
        if isinstance(value, list):
            for i in value:
                print key, ":", i
        elif isinstance(value, dict):
            for key2, value2 in value.items():
                print key2, ":", value2
        else:
            print key, ":", value